package com.zp.self.module.level_4_算法练习.数学.位运算;

/**
 * @author By ZengPeng
 */
public class 力扣_405_数字转换为十六进制数 {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_405_数字转换为十六进制数().toHex(26));
        System.out.println(new 力扣_405_数字转换为十六进制数().toHex(-25));
        String hex = "-FF";
        Integer x = Integer.parseInt("-FF",16);//从第2个字符开始截取
        System.out.println(x);
    }

    /**
     * 题目：给定一个整数，编写一个算法将这个数转换为十六进制数。对于负整数，我们通常使用 补码运算 方法。
     * 注意:
     * 十六进制中所有字母(a-f)都必须是小写。
     * 十六进制字符串中不能包含多余的前导零。如果要转化的数为0，那么以单个字符'0'来表示；对于其他情况，十六进制字符串中的第一个字符将不会是0字符。 
     * 给定的数确保在32位有符号整数范围内。
     * 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
     *
     * 示例 1：
     * 输入:
     * 26
     *
     * 输出:
     * "1a"
     *
     * 分析：
     *      -1在计算、内存中 以补码表示：
     *      1.先求出-1的 源码 ：1000 0000 0000 0001
     *      2.先求出-1的 反码 ：1111 1111 1111 1110
     *      3.先求出-1的 补码= 反码+1 ：1111 1111 1111 1111
     *
     *      转换：因为当前二进制已经是补码了，16进制补码 直接可以组装
     *      每4位二进制合并为一位16进制：ffff ffff
     *
     * 边界值 & 注意点：
     *      1.负数怎么搞？
     **/
    public String toHex(int num) {
        if(num==0) return "0";
        StringBuilder sb= new StringBuilder();
        while (num!=0 &&sb.length() < 8){
            int i = num & 15;
            if(i>9)sb.insert(0,(char) (87+i));
            else sb.insert(0,i);
            num=num>>4;
        }
        return sb.toString();
    }
}
